package cn.iocoder.yudao.module.call.service.record;

import cn.iocoder.yudao.framework.common.pojo.PageParam;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.module.call.api.record.dto.CallRecordDTO;
import cn.iocoder.yudao.module.call.api.record.dto.CallRecordIvrDTO;
import cn.iocoder.yudao.module.call.controller.admin.record.vo.*;
import cn.iocoder.yudao.module.call.dal.dataobject.record.CallRecordDO;
import cn.iocoder.yudao.module.call.dal.dataobject.record.CallRecordTranslateDO;

import javax.validation.Valid;
import java.util.List;
import java.util.Map;

/**
 * 通话录音 Service 接口
 *
 * @author 数创万维
 */
public interface CallRecordService {

    /**
     * 创建通话录音
     *
     * @param createReqVO 创建信息
     * @return 编号
     */
    Long createRecord(@Valid CallRecordSaveReqVO createReqVO);

    /**
     * 更新通话录音
     *
     * @param updateReqVO 更新信息
     */
    void updateRecord(@Valid CallRecordSaveReqVO updateReqVO);

    /**
     * 更新话单的转文字状态，因为是异步的，需要给一个进行中的状态
     *
     * @param id
     * @param status
     * @author PetePower
     * @since 2024-11-07
     */
    void updateRecordTransStatus(Long id, Integer status);

    /**
     * 删除通话录音
     *
     * @param id 编号
     */
    void deleteRecord(Long id);

    /**
     * 获得通话录音
     *
     * @param id 编号
     * @return 通话录音
     */
    CallRecordDO getRecord(Long id);

    /**
     * 获得通话录音转文字
     *
     * @param id
     * @return
     * @author PetePower
     * @since 2024-10-17
     */
    CallRecordTranslateDO getRecordTranslate(Long id);

    List<CallRecordTranslateDO> getRecordTranslateList(List<Long> ids);

    Map<Long, CallRecordTranslateDO> getRecordTranslateMap(List<Long> ids);

    /**
     * 创建通话录音转文字
     *
     * @param param
     * @author PetePower
     * @since 2024-10-17
     */
    void createRecordTranslate(CallRecordTransReqVO param);


    CallRecordDO getRecordByUserData(String userData);

    /**
     * 根据话单获取通话记录
     *
     * @param reqNo
     * @return
     * @author PetePower
     * @since 2024-10-21
     */
    CallRecordDO getRecordByReqNo(String reqNo);

    /**
     * 获得通话录音分页
     *
     * @param pageReqVO   分页查询
     * @param loginUserId
     * @return 通话录音分页
     */
    PageResult<CallRecordDO> getRecordPage(CallRecordPageReqVO pageReqVO, Long loginUserId);

    /**
     * 通话记录分页-呼叫中心 工作台
     *
     * @param pageReqVO
     * @return
     * @author PetePower
     * @since 2024-11-08
     */
    PageResult<CallRecordDO> getRecordPageByWorkbench(CallRecordWorkbenchPageReqVO pageReqVO);

    /**
     * 定时任务执行时使用， 获取待下载、转换的通话录音列表
     *
     * @param pageReqVO
     * @return
     * @author PetePower
     * @since 2024-10-17
     */
    List<CallRecordDO> getRecordList(CallRecordPageReqVO pageReqVO);


    PageResult<CallRecordIvrDTO> getRecordPageByIvr(CallRecordIvrPageReqVO reqVO);

    /**
     * 获取要转线索的话单
     */
    List<CallRecordDTO> getRecordListTransClue(Integer limit, Long minId, String taskId, List<Long> levels);

    /**
     * 创建通话备注
     * 1. 根据reqNo 查询话单do是否已经生成，如生成直接更新remark字段
     * 2. 如果没有生成，加入到缓存中，等待话单回调时再度创建remark
     *
     * @param reqVO
     * @author PetePower
     * @since 2024-11-22
     */
    void createRecordRemark(CallRecordRemarkReqVO reqVO);

    /**
     * 外呼记录 高级查询
     *
     * @param pageVO
     * @param loginUserId
     * @return
     * @author PetePower
     * @since 2024-12-27
     */
    PageResult<CallRecordDO> getRecordAdvancePage(PageParam pageVO, Long loginUserId);
}